lib/pull: Avoid calling destroy on unref'ed GSource
authorJonathan Lebon <jonathan@jlebon.com>
Wed, 23 Oct 2019 15:04:00 +0000 (11:04 -0400)
committerJonathan Lebon <jonathan@jlebon.com>
Wed, 23 Oct 2019 15:15:02 +0000 (11:15 -0400)
We're creating the timer source and then passing ownership to the
context, but because we didn't free the pointer, we would still call
`g_source_destroy` in the exit path. We'd do this right after doing
`unref` on the context too, which would have already destroyed and
unref'ed the source.

Drop that and just restrict the scope of that variable down to make
things more obvious.

Just noticed this after reviewing #1953.

src/libostree/ostree-repo-pull.c

index bcb8b42033d67c1625fb546e2f27c2bfa06ef86d..dd4dbff1089057bbad319d1a04bdf15e0993b5f2 100644 (file)
@@ -3573,7 +3573,6 @@ ostree_repo_pull_with_options (OstreeRepo             *self,
   g_autofree char **refs_to_fetch = NULL;
   g_autoptr(GVariantIter) collection_refs_iter = NULL;
   g_autofree char **override_commit_ids = NULL;
-  GSource *update_timeout = NULL;
   gboolean opt_gpg_verify_set = FALSE;
   gboolean opt_gpg_verify_summary_set = FALSE;
   gboolean opt_collection_refs_set = FALSE;
@@ -4505,6 +4504,8 @@ ostree_repo_pull_with_options (OstreeRepo             *self,
 
   if (pull_data->progress)
     {
+      g_autoptr(GSource) update_timeout = NULL;
+
       /* Setup a custom frequency if set */
       if (update_frequency > 0)
         update_timeout = g_timeout_source_new (pull_data->dry_run ? 0 : update_frequency);
@@ -4514,7 +4515,6 @@ ostree_repo_pull_with_options (OstreeRepo             *self,
       g_source_set_priority (update_timeout, G_PRIORITY_HIGH);
       g_source_set_callback (update_timeout, update_progress, pull_data, NULL);
       g_source_attach (update_timeout, pull_data->main_context);
-      g_source_unref (update_timeout);
     }
 
   /* Now await work completion */
@@ -4732,8 +4732,6 @@ ostree_repo_pull_with_options (OstreeRepo             *self,
   if (!inherit_transaction)
     ostree_repo_abort_transaction (pull_data->repo, cancellable, NULL);
   g_main_context_unref (pull_data->main_context);
-  if (update_timeout)
-    g_source_destroy (update_timeout);
   g_strfreev (configured_branches);
   g_clear_object (&pull_data->fetcher);
   g_clear_pointer (&pull_data->extra_headers, (GDestroyNotify)g_variant_unref);